Spring Boot-এ @Transactional একটি গুরুত্বপূর্ণ অ্যানোটেশন, যা ডেটাবেজ ট্রানজেকশন পরিচালনার জন্য ব্যবহার করা হয়। এটি স্প্রিং ফ্রেমওয়ার্কের মাধ্যমে ট্রানজেকশন ম্যানেজমেন্ট সহজ এবং কার্যকর করে তোলে।
@Transactional অ্যানোটেশন কী?
@Transactional অ্যানোটেশন ব্যবহার করে একটি মেথড বা ক্লাসের মধ্যে ডেটাবেজ অপারেশনগুলোকে একটি ট্রানজেকশনাল কনটেক্সটে পরিচালনা করা হয়। এর অর্থ হলো, মেথডে থাকা সমস্ত ডেটাবেজ অপারেশন হয় একসাথে সফল হবে, নয়তো একসাথে ব্যর্থ হবে।
@Transactional এর সুবিধা
- অটোমেটিক রোলব্যাক: কোনো একটি অপারেশন ব্যর্থ হলে ট্রানজেকশন রোলব্যাক হয়।
- ডেটা ইন্টেগ্রিটি: ডেটাবেসে একাধিক অপারেশন করলে ডেটার সঠিকতা বজায় থাকে।
- সহজ ব্যবস্থাপনা: ম্যানুয়াল ট্রানজেকশন ম্যানেজমেন্টের ঝামেলা এড়ায়।
- ডেটাবেস লক: প্রয়োজনে নির্দিষ্ট অপারেশনগুলোকে লক করে ডেটা নিরাপদ রাখে।
@Transactional অ্যানোটেশন কনফিগারেশন
১. মেথড লেভেলে @Transactional
একটি নির্দিষ্ট মেথডে ট্রানজেকশন পরিচালনার জন্য @Transactional ব্যবহার করা হয়।
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class ProductService {
@Transactional
public void saveProduct(Product product) {
// Save product to the database
}
}
২. ক্লাস লেভেলে @Transactional
ক্লাস লেভেলে @Transactional ব্যবহৃত হলে সেই ক্লাসের সমস্ত মেথড ট্রানজেকশনাল হিসেবে বিবেচিত হবে।
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class ProductService {
public void saveProduct(Product product) {
// Save product to the database
}
public void deleteProduct(Long id) {
// Delete product from the database
}
}
@Transactional এর কাজ করার পদ্ধতি
Spring ফ্রেমওয়ার্ক AOP (Aspect-Oriented Programming) ব্যবহার করে @Transactional পরিচালনা করে। যখন কোনো @Transactional মেথড এক্সিকিউট হয়, তখন একটি Proxy Object তৈরি হয়, যা মেথডের শুরুতে ট্রানজেকশন শুরু করে এবং মেথড শেষ হলে ট্রানজেকশন কমিট বা রোলব্যাক করে।
@Transactional এর গুরুত্বপূর্ণ অ্যাট্রিবিউটস
১. propagation
Propagation নির্ধারণ করে ট্রানজেকশন কীভাবে কাজ করবে, যদি কোনো মেথড আগে থেকেই ট্রানজেকশনে থাকে।
REQUIRED(ডিফল্ট): বিদ্যমান ট্রানজেকশন ব্যবহার করবে। না থাকলে নতুন একটি তৈরি করবে।REQUIRES_NEW: সবসময় নতুন ট্রানজেকশন শুরু করবে।MANDATORY: বিদ্যমান ট্রানজেকশন আবশ্যক, না থাকলে Exception ছুঁড়ে দেবে।
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveProduct(Product product) {
// Always starts a new transaction
}
২. isolation
Isolation Level নির্ধারণ করে যে, একাধিক ট্রানজেকশন একসাথে চলার সময় ডেটার অ্যাক্সেস কীভাবে নিয়ন্ত্রণ করা হবে।
READ_COMMITTED: শুধুমাত্র কমিট করা ডেটা পড়তে পারবে।READ_UNCOMMITTED: আনকমিট করা ডেটাও পড়তে পারবে।REPEATABLE_READ: একই ডেটা বারবার পড়লে একই থাকবে।SERIALIZABLE: ডেটাবেস টেবিল পুরোপুরি লক করবে।
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void updateProduct(Product product) {
// Ensures the same data is read consistently
}
৩. rollbackFor
কোনো নির্দিষ্ট Exception ঘটলে ট্রানজেকশন রোলব্যাক হবে।
@Transactional(rollbackFor = RuntimeException.class)
public void deleteProduct(Long id) {
// Rollback if RuntimeException occurs
}
৪. noRollbackFor
যদি নির্দিষ্ট Exception ঘটলেও রোলব্যাক না করতে হয়, এটি ব্যবহার করা হয়।
@Transactional(noRollbackFor = IllegalArgumentException.class)
public void updateProduct(Product product) {
// No rollback for IllegalArgumentException
}
@Transactional ব্যবহার করার সময় সতর্কতা
- Public মেথডে ব্যবহার করুন: Spring AOP শুধুমাত্র public মেথডে কাজ করে।
- Proper Propagation Level: সঠিক propagation নির্বাচন করুন, কারণ এটি বিদ্যমান ট্রানজেকশনে প্রভাব ফেলতে পারে।
- Lazy Loading: ট্রানজেকশনের বাইরে Lazy-Loaded ডেটা অ্যাক্সেস করার চেষ্টা করলে Exception হতে পারে।
উদাহরণ: সম্পূর্ণ ব্যবহারের দৃশ্য
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class OrderService {
@Autowired
private ProductRepository productRepository;
@Autowired
private OrderRepository orderRepository;
@Transactional
public void placeOrder(Long productId, int quantity) {
Product product = productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));
if (product.getStock() < quantity) {
throw new RuntimeException("Insufficient stock");
}
product.setStock(product.getStock() - quantity);
productRepository.save(product);
Order order = new Order();
order.setProductId(productId);
order.setQuantity(quantity);
orderRepository.save(order);
}
}
সারাংশ
@Transactional Spring Boot ORM এর একটি শক্তিশালী অ্যানোটেশন যা ডেটাবেস ট্রানজেকশন পরিচালনা সহজ করে। এটি ডেটার সঠিকতা বজায় রাখে এবং কোড সিম্পলিফাই করে। propagation, isolation, এবং rollbackFor এর মতো অ্যাট্রিবিউটগুলো ব্যবহার করে ট্রানজেকশন আরও কাস্টমাইজ করা যায়।
Read more